// public: 公开的;     自己 自己的子类  和其他类都能访问
// protected：受保护的;    自己和自己子类能访问，其他类不能访问
// private 私有的;   自己能访问，子类和其他类不能访问

// ***三种属性可以设置给 类中的属性/方法***

// public关键字

class cup {
    // width: number
    // constructor(width: number) {
    //     this.width = width
    // }
    // 使用public关键字后,上方及下方内容是相等的
    constructor(public width: number) {
    }
}


// public的另一种用法:指定属性为readonly

class phone {
    public readonly price: string
    constructor(price: string) {
        this.price = price
    }
    changePrice(price: string) {
        // this.price = price  报错：无法分配到 "price" ，因为它是只读属性。
    }
}



// 定义父类
class Father {
    public name: string; //公开的,自己/子类/实例化的自己/子类 都可以访问
    protected age: number; // 自己和自己的子类可以访问，其他类不能访问
    private money: number; //私有类,只有自己能访问,其他类不能访问
    constructor(name: string, age: number, money: number) {
        this.name = name;
        this.age = age;
        this.money = money;
    }
    getName(): string {
        return this.name
    }
}

class Child extends Father {
    constructor(name: string, age: number, money: number) {
        super(name, age, money)
    }
    desc() {
        console.log(this.name);
        console.log(this.age);  //protected的属性,在子类中可以访问
        // console.log(this.money);  报错:属性“money”为私有属性，只能在类“Father”中访问。
    }
}


let child = new Child('zhufeng', 11, 11)
console.log(child.name);
// console.log(child.money); //属性“money”为私有属性，只能在类“Father”中访问。

// console.log(child.age); //属性“age”受保护，只能在类“Father”及其子类中访问。



// 类的静态属性/静态方法

// 如果子类父类都拥有一个方法,子类方法会覆盖父类方法